/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo;

import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author HNCR
 */
public class Factura implements Serializable{
    private String cod_factura;
    private Date fecha;
    private Cliente objCliente=new Cliente();
    private Usuario objUsuario=new Usuario();
    private String estado;
    private double total;
    private String salida;
    private int cant;
    private Date fecha2;
    private String dia;
    private int anio;
    private String mes;
    private int anio1;

    public String getSalida() {
        return salida;
    }

    public void setSalida(String salida) {
        this.salida = salida;
    }
    

    public Factura() {
    }

    public String getCod_factura() {
        return cod_factura;
    }

    public void setCod_factura(String cod_factura) {
        this.cod_factura = cod_factura;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public Cliente getObjCliente() {
        return objCliente;
    }

    public void setObjCliente(Cliente objCliente) {
        this.objCliente = objCliente;
    }

    public Usuario getObjUsuario() {
        return objUsuario;
    }

    public void setObjUsuario(Usuario objUsuario) {
        this.objUsuario = objUsuario;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }

    public int getCant() {
        return cant;
    }

    public void setCant(int cant) {
        this.cant = cant;
    }

    public Date getFecha2() {
        return fecha2;
    }

    public void setFecha2(Date fecha2) {
        this.fecha2 = fecha2;
    }

    public String getDia() {
        return dia;
    }

    public void setDia(String dia) {
        this.dia = dia;
    }

    public int getAnio() {
        return anio;
    }

    public void setAnio(int anio) {
        this.anio = anio;
    }

    public String getMes() {
        return mes;
    }

    public void setMes(String mes) {
        this.mes = mes;
    }

    public int getAnio1() {
        return anio1;
    }

    public void setAnio1(int anio1) {
        this.anio1 = anio1;
    }
    
    //==========================================================================
    //-----registro
    public static boolean registrarFactura (Factura a)
    {
        boolean estado = false ;
        Connection conexion=null;
        FacesContext contex = FacesContext.getCurrentInstance();
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {CALL sp_factura_crear "
                     +"(?,?,?)} ");
             st.setString(1,a.getObjCliente().getNombre());
             //se trae la variable desde la sesion cod_usuario
             st.setInt(2,Integer.parseInt(contex.getExternalContext().getSessionMap().get("cod_usuario").toString()));  
             st.registerOutParameter(3,java.sql.Types.VARCHAR);
             st.execute();
             a.setCod_factura(st.getString(3));
             if(a.getCod_factura()!=null)
             {
               estado=true;
                }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
    }
    
    //---------- listar---lista todas las facturas
    public static ArrayList<Factura> getListarFacturas_hoy(){
     ArrayList<Factura> arreglo=null;
     ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_factura_listar_todas_hoy()}");
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                        obj =new Factura();
                        obj.setCod_factura(rs.getString("cod_factura"));
                        obj.setFecha(rs.getDate("fecha"));
                        obj.getObjCliente().setNombre(rs.getString("nombre"));
                        obj.getObjUsuario().setUsuario(rs.getString("usuario"));
                        obj.getObjUsuario().getObjTrabajador().setApellidos(rs.getString("apellidos"));
                        obj.getObjUsuario().getObjTrabajador().setNombres(rs.getString("nombres"));
                        obj.setEstado(rs.getString("estado"));
                        obj.setTotal(rs.getDouble("total"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    //---------- listar---lista todas las facturas
    public static ArrayList<Factura> getListarFacturasHoyAbiertas(){
     ArrayList<Factura> arreglo=null;
     ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_factura_listar_hoy_abiertas()}");
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                        obj =new Factura();
                        obj.setCod_factura(rs.getString("cod_factura"));
                        obj.getObjCliente().setNombre(rs.getString("nombre"));
                        obj.getObjUsuario().setUsuario(rs.getString("usuario"));
                        obj.getObjUsuario().getObjTrabajador().setApellidos(rs.getString("apellidos"));
                        obj.getObjUsuario().getObjTrabajador().setNombres(rs.getString("nombres"));
                        obj.setEstado(rs.getString("estado"));
                        obj.setTotal(rs.getDouble("total"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    //---------- listar---lista todas las facturas por fecha
    public static ArrayList<Factura> getListarFacturasFecha(Factura factura){
     ArrayList<Factura> arreglo=null;
     ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{CALL sp_factura_listar_x_fecha(?)}");
            if(factura.getFecha()!=null)
                st.setDate(1, new java.sql.Date(factura.getFecha().getTime()));
            else
                st.setDate(1, null);
            
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                        obj =new Factura();
                        obj.setCod_factura(rs.getString("cod_factura"));
                        obj.setFecha(rs.getDate("fecha"));
                        obj.getObjCliente().setNombre(rs.getString("nombres"));
                        obj.getObjUsuario().setUsuario(rs.getString("usuario"));
                        obj.getObjUsuario().getObjTrabajador().setApellidos(rs.getString("apellidos"));
                        obj.getObjUsuario().getObjTrabajador().setNombres(rs.getString("nombres"));
                        obj.setEstado(rs.getString("estado"));
                        obj.setTotal(rs.getDouble("total"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    
    /*
     * combo muestra las facturas activas del día
     */
    public ArrayList<SelectItem>getCargarComboFacturaDia(){         
    ArrayList<SelectItem> arrayNivel = new ArrayList<SelectItem>();
    Connection conexion = null;
    ResultSet rs = null;
    try{
    conexion = ControladorBD.darConexionBD();
    CallableStatement st = conexion.prepareCall( "{CALL sp_factura_combo()}");    
    rs = st.executeQuery();        
    if (rs.next()){    
      do{
        arrayNivel.add(new SelectItem(rs.getString("cod_factura"), 
                rs.getString("cod_factura")+" - "+rs.getString("nombre")));              
      } while (rs.next());
    }  
         rs.close();
         st.close();
         conexion.close();

     }catch(Exception error){
        System.out.println("Error en el metodo por: " +
                   error.getMessage());
                error.printStackTrace();
        }    
      
    return arrayNivel;
    }
    
    //-----------reportes
    public static ArrayList<Factura> getListarResporte1(Factura ing){
     ArrayList<Factura> arreglo=null;
    ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_facturas_x_usuario_fecha(?)}");
             st.setDate(1, new java.sql.Date(ing.getFecha().getTime()));
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                      obj =new Factura();
                        obj.getObjUsuario().setUsuario(rs.getString("usuario"));
                        obj.getObjUsuario().getObjTrabajador().setNombres(rs.getString("nombre"));
                        obj.setCant(rs.getInt("cantidad"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    public static ArrayList<Factura> getListarResporte3(Factura ing){
     ArrayList<Factura> arreglo=null;
    ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        String d="";
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_facturas_canceladas_x_fecha(?,?)}");
             st.setDate(1, new java.sql.Date(ing.getFecha().getTime()));
             st.setDate(2, new java.sql.Date(ing.getFecha2().getTime()));
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                      obj =new Factura();
                        obj.setFecha(rs.getDate("fecha"));
                        d=rs.getString("dia");
                   switch (d) {
                       case "Monday":
                           obj.setDia("Lunes");
                           break;
                       case "Tuesday":
                           obj.setDia("Martes");
                           break;
                       case "Wednesday":
                           obj.setDia("Miercoles");
                           break;
                       case "Thursday":
                           obj.setDia("Jueves");
                           break;
                       case "Friday":
                           obj.setDia("Viernes");
                           break;
                       case "Saturday":
                           obj.setDia("Sábado");
                           break;
                       case "Sunday":
                           obj.setDia("Domingo");
                           break;
                   }
                        obj.setCant(rs.getInt("cancelado"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    public static ArrayList<Factura> getListarResporte5(Factura ing){
     ArrayList<Factura> arreglo=null;
    ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        int mes;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_total_x_mes_x_anio(?)}");
             st.setInt(1, ing.getAnio());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                      obj =new Factura();
                        mes=rs.getInt("mes");
                   switch (mes) {
                       case 1:
                           obj.setMes("ENERO");
                           break;
                       case 2:
                           obj.setMes("FEBRERO");
                           break;
                       case 3:
                           obj.setMes("MARZO");
                           break;
                       case 4:
                           obj.setMes("ABRIL");
                           break;
                       case 5:
                           obj.setMes("MAYO");
                           break;
                       case 6:
                           obj.setMes("JUNIO");
                           break;
                       case 7:
                           obj.setMes("JULIO");
                           break;
                       case 8:
                           obj.setMes("AGOSTO");
                           break;
                       case 9:
                           obj.setMes("SETIEMBRE");
                           break;
                       case 10:
                           obj.setMes("OCTUBRE");
                           break;
                       case 11:
                           obj.setMes("NOVIEMBRE");
                           break;
                       case 12:
                           obj.setMes("DICIEMBRE");
                           break;
                   }
                   obj.setTotal(rs.getDouble("total"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    public static ArrayList<Factura> getListarResporte6(Factura ing){
    ArrayList<Factura> arreglo=null;
    ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_total_ventas_x_anio(?,?)}");
             st.setInt(1, ing.getAnio());
             st.setInt(2, ing.getAnio1());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                      obj =new Factura();
                        obj.setAnio(rs.getInt("anio"));                   
                        obj.setTotal(rs.getDouble("total"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    public static ArrayList<Factura> getListarResporte7(Factura ing){
    ArrayList<Factura> arreglo=null;
    ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_fact_anuladas_x_anio(?)}");
             st.setInt(1, ing.getAnio());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                      obj =new Factura();
                        obj.getObjUsuario().getObjTrabajador().setNombres(rs.getString("trabajador"));                   
                        obj.setCod_factura(rs.getString("cod_factura"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    public static ArrayList<Factura> getListarResporte8(Factura ing){
    ArrayList<Factura> arreglo=null;
    ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        int mes;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_consumo_mas_alto_x_mes_anio(?)}");
             st.setInt(1, ing.getAnio());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                      obj =new Factura();
                        mes=rs.getInt("mes");
                        switch (mes) {
                       case 1:
                           obj.setMes("ENERO");
                           break;
                       case 2:
                           obj.setMes("FEBRERO");
                           break;
                       case 3:
                           obj.setMes("MARZO");
                           break;
                       case 4:
                           obj.setMes("ABRIL");
                           break;
                       case 5:
                           obj.setMes("MAYO");
                           break;
                       case 6:
                           obj.setMes("JUNIO");
                           break;
                       case 7:
                           obj.setMes("JULIO");
                           break;
                       case 8:
                           obj.setMes("AGOSTO");
                           break;
                       case 9:
                           obj.setMes("SETIEMBRE");
                           break;
                       case 10:
                           obj.setMes("OCTUBRE");
                           break;
                       case 11:
                           obj.setMes("NOVIEMBRE");
                           break;
                       case 12:
                           obj.setMes("DICIEMBRE");
                           break;
                   }
                        obj.setCod_factura(rs.getString("cod_factura"));
                        obj.setTotal(rs.getDouble("total"));
                        obj.getObjUsuario().getObjTrabajador().setNombres(rs.getString("trabajador"));                   
                        
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    public static ArrayList<Factura> getListarResporte9(Factura ing){
    ArrayList<Factura> arreglo=null;
    ResultSet rs=null;
        Factura obj=null;
        Connection conexion = null;
        int mes;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_reportes_monto_x_anio_x_mes(?,?)}");
             st.setInt(1, ing.getAnio());
             st.setInt(2, ing.getAnio1());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Factura>();   
                do{
                      obj =new Factura();
                      obj.setAnio(rs.getInt("anio"));
                        mes=rs.getInt("mes");
                        switch (mes) {
                       case 1:
                           obj.setMes("ENERO");
                           break;
                       case 2:
                           obj.setMes("FEBRERO");
                           break;
                       case 3:
                           obj.setMes("MARZO");
                           break;
                       case 4:
                           obj.setMes("ABRIL");
                           break;
                       case 5:
                           obj.setMes("MAYO");
                           break;
                       case 6:
                           obj.setMes("JUNIO");
                           break;
                       case 7:
                           obj.setMes("JULIO");
                           break;
                       case 8:
                           obj.setMes("AGOSTO");
                           break;
                       case 9:
                           obj.setMes("SETIEMBRE");
                           break;
                       case 10:
                           obj.setMes("OCTUBRE");
                           break;
                       case 11:
                           obj.setMes("NOVIEMBRE");
                           break;
                       case 12:
                           obj.setMes("DICIEMBRE");
                           break;
                   }
                        
                        obj.setTotal(rs.getDouble("monto"));                 
                        
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
    
    
}
